package managedbeans;

import java.io.IOException;
import java.util.ArrayList;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import model.AdministradorRepAF;
import bean.ArtPendiente;
import bean.Articulo;
import entities.ArtPendienteRepAF;
import entities.ArticuloRepAF;

public class RepAFServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private ArrayList<Articulo> articulosReposicion = new ArrayList<Articulo>();
	ArrayList<ArtPendiente> articulosPendientes = new ArrayList<ArtPendiente>();
	private ArrayList<ArticuloRepAF> listaReposicion = new ArrayList<ArticuloRepAF>();
	private ArrayList<ArtPendienteRepAF> listaPendientes = new ArrayList<ArtPendienteRepAF>();
	String init;

	public RepAFServlet() {
		super();

	}

	@Override
	public void init(ServletConfig config) throws ServletException {
		super.init(config);
		this.init = "init";
	}

	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		String estado = (String) request.getParameter("estado");
		String id = (String) request.getParameter("id");
		String value = (String) request.getParameter("value");
		if (estado == null) {
			estado = "";
		}
		// obtengo y convierto las listas a sus clases correspondientes
		if (init.equals("init")) {
			inicializar();
			request.setAttribute("listaReposicion", listaReposicion);
			request.setAttribute("listaPendientes", listaPendientes);
			getServletContext().getRequestDispatcher(
					"/listadoReposicion.jsp").forward(request, response);
			request.setAttribute("estado", "update");
			// una vez cargada la lista de pendientes inicializo sus cantidades
			// en 0
			setPendientesaCero();

		} else if (estado.equals("update")) {
			procesarUpdate(request, response, id, value);
			imprimirListas();
		} else {
			// Envio el form
			actualizarPedidos(request, response);
		}

	}

	private void setPendientesaCero() {
		for (ArtPendienteRepAF p : listaPendientes) {
			p.setCantidad(0);
		}

	}

	private ArrayList<ArtPendienteRepAF> convertirArticulosPendientes(
			ArrayList<ArtPendiente> articulosPendientes2) {
		for (ArtPendiente p : articulosPendientes2) {
			ArtPendienteRepAF art = new ArtPendienteRepAF();
			art.setId(p.getId());
			art.setIdTienda(p.getIdTienda());
			art.setReferencia(p.getReferencia());
			art.setCantidad(p.getCantidad());
			art.setNumSolDist(p.getNumSolDist());
			art.setMensaje("");
			listaPendientes.add(art);
		}
		return listaPendientes;

	}

	private ArrayList<ArticuloRepAF> convertirArticulosReposicion(
			ArrayList<Articulo> articulosReposicion2) {
		for (Articulo a : articulosReposicion2) {
			ArticuloRepAF art = new ArticuloRepAF();
			art.setReferencia(a.getReferencia());
			art.setLinea(a.getLinea());
			art.setDescripcion(a.getDescripcion());
			art.setColor(a.getColor());
			art.setSeccion(a.getSeccion());
			art.setPreciovu(a.getPreciovu());
			art.setStock(a.getStock());
			listaReposicion.add(art);
		}
		return listaReposicion;
	}

	private void inicializar() {
		articulosReposicion = AdministradorRepAF.obtenerInstancia()
				.obtenerArticulosRecibidos();
		if (articulosReposicion != null) {
			listaReposicion = convertirArticulosReposicion(articulosReposicion);
			articulosPendientes = AdministradorRepAF.obtenerInstancia()
					.obtenerArticulosPendientesEnvio(articulosReposicion);
			if (articulosPendientes != null) {
				listaPendientes = convertirArticulosPendientes(articulosPendientes);
			}

		}
		alcanzaParaTodos();
		init = "";
	}

	private void alcanzaParaTodos() {
		// alcanza determinado articulo para todos los pedidos
		for (ArticuloRepAF a : listaReposicion) {
			int stock = a.getStock();
			int cantPedida = 0;
			for (ArtPendienteRepAF p : listaPendientes) {
				if (p.getReferencia() == a.getReferencia()) {
					cantPedida = cantPedida + p.getCantidad();
				}
			}
			if (cantPedida <= stock) {
				a.setMensaje("Alcanza para todos los pedidos");
			} else {
				a.setMensaje("No alcanza para todos los pedidos");
			}
			cantPedida = 0;
		}

	}

	private void procesarUpdate(HttpServletRequest request,
			HttpServletResponse response, String id, String value) {
		String[] keys = id.split("\\+");
		String referencia = keys[0];
		String idTienda = keys[1];
		String numSolDist = keys[2];
		// es el valor de recibidos que se modifica
		String result = value;

		// si el stock no me alcanza poner valores anteriores
		// y mostrar con msj acutlizando la cant q puedo mandar
		// si me alcanza actualizar ambas listas y borrar todos los
		// msj de pendientes
		int pedido = Integer.valueOf(value);
		int stockReal = obtenerStockRecibido(referencia);
		if (stockReal >= pedido) {
			result = actualizarListaRecibidos(referencia, pedido);
			actualizarListaPendientes(referencia, idTienda, numSolDist, pedido,
					stockReal, "ALCANZO");
		} else {
			// pongo valores anteriores
			obtenerPendiente(referencia, idTienda, numSolDist)
					.setMensaje(
							"No se actualizo el pedido, debe enviar una cantidad menor");
			result = String.valueOf(obtenerStockRecibido(referencia));
		}

		response.setContentType("text/xml");
		response.setHeader("Cache-Control", "no-cache");
		// armo respuesta
		String valorStock = "<value>" + result + "</value>";
		String idP = "<idP>" + "div2+" + id + "</idP>";

		String msj = "<msj>"
				+ obtenerPendiente(referencia, idTienda, numSolDist)
						.getMensaje() + "</msj>";
		String ajax = "<id>" + referencia + valorStock + idP + msj + "</id>";
		try {
			response.getWriter().write(ajax);

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		System.out.println("salio!!!!!");

	}

	private ArtPendienteRepAF obtenerPendiente(String referencia,
			String idTienda, String numSolDist) {
		ArtPendienteRepAF ret = null;
		for (ArtPendienteRepAF a : listaPendientes) {
			if (a.getReferencia() == Integer.valueOf(referencia)
					&& a.getIdTienda() == Integer.valueOf(idTienda)
					&& a.getNumSolDist() == Integer.valueOf(numSolDist)) {
				ret = a;
			}
		}
		return ret;

	}

	private String actualizarListaRecibidos(String id, int value) {
		int idA = Integer.valueOf(id);
		String result = "";
		for (ArticuloRepAF a : listaReposicion) {
			if (a.getReferencia() == idA) {
				a.setStock(a.getStock() - value);
				result = String.valueOf(a.getStock());
			}
		}
		return result;
	}

	private String actualizarListaPendientes(String id, String idTienda,
			String numSolDist, int value, int stock, String status) {
		int idP = Integer.valueOf(id);
		int idT = Integer.valueOf(idTienda);
		int nSol = Integer.valueOf(numSolDist);

		for (ArtPendienteRepAF a : listaPendientes) {
			a.setMensaje("");
			if (a.getReferencia() == Integer.valueOf(idP)
					&& a.getIdTienda() == idT && a.getNumSolDist() == nSol) {
				if (status == "ALCANZO") {
					a.setCantidad(value);
					a.setMensaje("Actualizado");
				} else {
					a.setMensaje("No se actualizo el pedido, debe enviar una cantidad menor");
				}
			}
		}
		return "";

	}

	private int obtenerStockPedido(String id, String idTienda, String numSolDist) {
		int result = (Integer) null;
		int idP = Integer.valueOf(id);
		int idT = Integer.valueOf(idTienda);
		int nSol = Integer.valueOf(numSolDist);
		for (ArtPendienteRepAF a : listaPendientes) {
			if (a.getReferencia() == idP && a.getIdTienda() == idT
					&& a.getNumSolDist() == nSol) {
				result = a.getCantidad();
			}
		}
		return result;
	}

	int obtenerStockRecibido(String referencia) {
		int result = 0;
		for (ArticuloRepAF a : listaReposicion) {
			if (a.getReferencia() == Integer.valueOf(referencia)) {
				result = a.getStock();
			}
		}
		return result;
	}

	private void actualizarPedidos(HttpServletRequest request,
			HttpServletResponse response) {

		for (ArticuloRepAF a : listaReposicion) {
			for (Articulo art : articulosReposicion) {
				if (art.getReferencia() == a.getReferencia()) {
					art.setStock(a.getStock());
				}
			}
		}

		for (ArtPendienteRepAF p : listaPendientes) {
			for (ArtPendiente art2 : articulosPendientes) {
				if (art2.getReferencia() == p.getReferencia()
						&& art2.getIdTienda() == p.getIdTienda()
						&& art2.getNumSolDist() == p.getNumSolDist()) {
					art2.setCantidad(p.getCantidad());
				}
			}
		}
		AdministradorRepAF.obtenerInstancia().actualizarPedidos(
				articulosReposicion, articulosPendientes);
		try {
			this.init = "";
			getServletContext().getRequestDispatcher("/index.jsp").forward(request, response);
		} catch (ServletException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	public void imprimirListas() {
		System.out.println("#######################################");
		System.out.println("Lista Reposicion");
		for (ArticuloRepAF a : listaReposicion) {
			System.out.println(a.getReferencia() + "   :   " + a.getStock());
		}
		System.out.println("Lista Pendientes");
		for (ArtPendienteRepAF a : listaPendientes) {
			System.out.println(a.getReferencia() + "   :   " + a.getCantidad());
		}
	}

	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
	}

}
